#pragma once
#include "log.hpp"
#include "Socket.hpp"
#include <iostream>
#include <signal.h>
#include <functional>
using namespace std;
using func_t = function<string(string &package)>;

class TCPServer
{
public:
    TCPServer(uint16_t port, func_t callback)
        : _port(port), _callback(callback)
    {
    }
    // 初始化服务器
    // 创建 socket → 绑定端口 → 开始监听
    void init()
    {
        _listen_sockfd.Socket();
        _listen_sockfd.Bind(_port);
        _listen_sockfd.Listen();
        log(Info, "init server...Done");
    }

    // 启动服务器，处理客户端请求
    void start()
    {
        signal(SIGCHLD, SIG_IGN);
        signal(SIGPIPE, SIG_IGN);
        while (true)// 无限循环，持续接收客户端
        {
            string clientip;
            uint16_t clientport;
            // 1. 接收客户端连接：得到「通信 socket」（专门和这个客户端通信）
            int communication_sockfd = _listen_sockfd.Accept(&clientport, &clientip);
            if (communication_sockfd < 0)
                continue;

            log(Info, "accept a new link, communication sockfd: %d, clientip: %s, clientport: %d", communication_sockfd, clientip.c_str(), clientip);

            // 2. fork 子进程：父进程继续监听，子进程处理这个客户端的请求
            if (fork() == 0)
            {
                _listen_sockfd.Close();
                string inbuffer_stream;// 存储接收到的字节流（可能包含多个报文）

                // 3. 子进程循环处理这个客户端的请求
                while (true)
                {
                    // 3.1 读取客户端发来的数据（最多 128 字节）
                    char buffer[128];// 接收缓冲区
                    ssize_t n = read(communication_sockfd, buffer, sizeof(buffer));
                    if (n > 0)
                    {
                        // 成功读到数据
                        buffer[n] = '\0';
                        inbuffer_stream += buffer; // 把读到的字节流存入缓冲区

                        log(Debug, "debug:\n%s", inbuffer_stream.c_str());
                        // 3.2 循环解析缓冲区中的报文（可能有多个）
                        while (true)
                        {
                            // 调用业务处理函数（_callback，即服务器的计算逻辑）
                            string info = _callback(inbuffer_stream);
                            if (info.empty())// 缓冲区没有完整报文，退出循环等下一次读
                                break;
                            log(Debug, "debug, response:\n%s", info.c_str());
                            log(Debug, "debug, inbuffer:\n%s", inbuffer_stream.c_str());
                            write(communication_sockfd, info.c_str(), info.size());// 3.3 把处理结果（info 是编码后的响应报文）写给客户端
                        }
                    }
                    else if (n == 0)// 客户端断开连接
                        break;
                    else // 读错误
                        break;
                }

                exit(0);// 子进程处理完一个客户端，退出
            }
            close(communication_sockfd);// 父进程不需要通信 socket，关闭节省资源
        }
    }

    ~TCPServer()
    {
    }

private:
    uint16_t _port;
    Sock _listen_sockfd;
    func_t _callback;// 函数对象（function<string(string &package)>）,指 向服务器的计算函数，实现「网络框架」和「业务逻辑」的解耦。
};